package com.xiaoshuidi.cloud.module.contract.dal.dataobject.contract;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.xiaoshuidi.cloud.framework.mybatis.core.dataobject.DeptFilter;
import com.xiaoshuidi.cloud.framework.tenant.core.db.TenantBaseDO;
import com.xiaoshuidi.cloud.module.contract.controller.admin.bill.vo.orderFees.OrderFeesVo;
import lombok.*;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;

/**
 * 企业合同 DO
 *
 * @author red
 */
@TableName(value = "contract_company",autoResultMap = true)
@KeySequence("contract_company_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库，可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CompanyContractDO extends TenantBaseDO implements DeptFilter {
    /**
     * id
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * 企业客户id
     */
    private Long customerCompanyId;
    /**
     * 企业名称
     */
    private String companyName;
    /**
     * 紧急联系人姓名
     */
    private String emergencyContactName;

    /**
     * 紧急联系人手机号
     */
    private String emergencyContactPhone;

    /**
     * 紧急联系人关系
     */
    private String emergencyContactRelationship;
    /**
     * 费用承担方式
     */
    private Integer orderShareMethod;
    /**
     * 企业合同编号
     */
    private String contractNo;
    /**
     * 纸质合同编号
     */
    private String offlineNo;
    /**
     * 合同类型 paper纸质合同 | electronic 电子合同
     */
    private String contractSort;
    /**
     * 合同分类 normal 普通合同 | segmented 分段合同 |rentfree 免租期合同
     */
    private String contractType;
    /**
     * 是否按自然月 0 默认非自然月 1 自然月
     */
    private Integer naturalMonthOrder;
    /**
     * 此合同对应的房间id列表
     */
    @TableField(typeHandler = BillDetailHandler.class)
    @JsonSubTypes.Type(JSON.class)
    private List<Long> roomIds;
    /**
     * 是否统一定价
     */
    private Boolean isUnifiedPricing;
    /**
     * 统一定价月租金
     */
    private BigDecimal monthRental;
    /**
     * 物业费
     */
    private BigDecimal propertyAmount;
    /**
     * 开始日期
     */
    private LocalDate startTime;
    /**
     * 结束日期
     */
    private LocalDate endTime;
    /**
     * 实际结束日期
     */
    private LocalDate actualEndTime;
    /**
     * 杂费列表
     */
    @TableField(typeHandler = BillDetailHandler.class)
    @JsonSubTypes.Type(JSON.class)
    private List<OrderFeesVo> fees;
    /**
     * 付几
     */
    private Integer payMethodF;
    /**
     * 押几
     */
    private Integer payMethodY;
    /**
     * 收租类型 advanced  提前收租天 | fixed 固定当月日期 日 | prefixed 固定上月日期 日
     */
    private String rentPayWay;
    /**
     * 收租类型日
     */
    private Integer advancedDays;
    /**
     * 优惠类型 cycle 周期性优惠 | once 一次性优惠
     */
    private String discountSort;
    /**
     * 优惠方式
     */
    private String discountType;
    /**
     * 优惠值
     */
    private BigDecimal discountValue;
    /**
     * 一次性优惠金额计入首期或末期账单
     */
    private String discountOrder;
    /**
     * 叠加优惠类型：cycle 周期性 | once  一次性
     */
    private String extraDiscountSort;
    /**
     * 优惠方式 rate 优惠比例 % | amount 优惠金额 元/月 | once 优惠金额 元
     */
    private String extraDiscountType;
    /**
     * 一次性优惠计入账单：first 计入首次 | last 计入末次
     */
    private String extraDiscountOrder;
    /**
     * 优惠值
     */
    private BigDecimal extraDiscountValue;
    /**
     * 合同状态
     */
    private String status;
    /**
     * 审核状态  pending 待审批  | pass 审批通过 | reject 审批驳回
     */
    private String approveStatus;
    /**
     * 合同签约发起人-甲方
     */
    private Long signerId;
    /**
     * 签约人姓名-甲方
     */
    private String signerName;
    /**
     * 签约时间
     */
    private LocalDate signedTime;
    /**
     * 客户来源
     */
    private String source;
    /**
     * 是否按合同原押金
     */
    private Integer isOriginalDeposit;
    /**
     * 是否按原租金设置押金
     */
    private Integer isDiscountRent;
    /**
     * 合同备注
     */
    private String remark;
    /**
     * 合同附件地址
     */
    private String contractUrl;

    /**
     * 审批流程id
     */
    private String processInstance;
    /**
     * 部门id/门店id
     */
    @TableField(fill = FieldFill.INSERT)
    private Long deptId;

    @Override
    public void setDeptId(Long deptId) {
        this.deptId = deptId;
    }

    /**
     * 押金 选择其他押金时需传值
     */
    private BigDecimal deposit;

    /**
     * 合同原状态
     */
    private String oldStatus;

    //serverList自定义解析器
    public static class BillDetailHandler extends JacksonTypeHandler {
        public BillDetailHandler(Class<?> type) {
            super(OrderFeesVo.class);
        }
        @Override
        protected List<OrderFeesVo> parse(String json) {
            return JSON.parseArray(json, OrderFeesVo.class);
        }
    }
}
